home *** CD-ROM | disk | FTP | other *** search
/ The PC-SIG Library 10 / The PC-Sig Library - Shareware for the IBM PC and Compatibles (PC-SIG)(Tenth Edition Disks 1-2804)(1991).iso / PC_SIGCD / 05 / 6 / DISK0564.ZIP / SOURCE.ARC / ASM.ARC / PRINTDD.ASM < prev    next >
Assembly Source File  |  1987-11-01  |  4KB  |  114 lines

  1.         SUBTTL  PRINTDD - PRINT A DOUBLE WORD IN DI:SI
  2.     PAGE
  3. ;       This is a modified version of a routine from SDIR Version
  4. ;       2.4, by Ted Reuss (modified from a program by John Chapman), on
  5. ;       PC-SIG Volume 185.
  6.  
  7.         .XLIST
  8.         INCLUDE ASCII.DEF
  9.         INCLUDE MSDOS2.DEF
  10.         .LIST
  11.  
  12.     DOSSEG
  13.     .MODEL    SMALL
  14.  
  15.     .DATA
  16. LDZERO  DB      1 DUP (?)
  17. DOUBLE  DB      8 DUP (20H)
  18.         DB      '$'
  19. DBLCNT  DW      1 DUP (?)
  20.  
  21.     .CODE
  22. PUBLIC  PRINTDD
  23.  
  24. PRINTDD PROC    NEAR            ;Prints a 32 bit integer in DI:SI
  25.                                 ;AL = 0 to suppress leading 0's
  26.                 ;   = "0" (60Q) to print leading 0's
  27.                 ;   = " " (20Q) to print leading spaces
  28.         MOV     BYTE PTR LDZERO,AL
  29.     MOV    BX,OFFSET DOUBLE
  30.     MOV    CX,8
  31. FILL:    MOV    BYTE PTR [BX],SPACE  ;FILL BUFFER WITH SPACES
  32.     INC    BX
  33.     LOOP    FILL
  34.         CALL    PRINTDX         ;format the double word into DOUBLE     2.4
  35.         MOV     DX,OFFSET DOUBLE
  36.         MOV     BX,DX
  37.         MOV     CX,7            ;SUPPRESS LEADING 0'S
  38. SUPP0:  CMP    BYTE PTR [BX],SPACE
  39.         JNE     SPDONE
  40.         MOV     AL,BYTE PTR LDZERO
  41.     AND    AL,AL
  42.     JNZ    SUPP2
  43.     INC    DX
  44. SUPP1:
  45.         MOV     [BX],AL
  46. SUPP2:
  47.         INC     BX
  48.         LOOP    SUPP0
  49. SPDONE:
  50.         MOV     AH,CON_STRING_OUTPUT
  51.         INT     DOS             ;print the digits                       2.4
  52.         RET                     ;and return                             2.4
  53. PRINTDD ENDP                    ;                                       2.4
  54.  
  55. PRINTDX PROC    NEAR            ;converts integer in DI:SI to decimal   2.4
  56.         MOV     WORD PTR DBLCNT,0   ;reset the offset for DOUBLE   2.4
  57.         XOR     AX,AX           ;Zero out the                           2.4
  58.         MOV     BX,AX           ; working
  59.         MOV     BP,AX           ; registers.
  60.         MOV     CX,32           ;# bits of precision
  61. J1:     SHL     SI,1
  62.         RCL     DI,1
  63.         XCHG    BP,AX
  64.         CALL    J6
  65.         XCHG    BP,AX
  66.         XCHG    BX,AX
  67.         CALL    J6
  68.         XCHG    BX,AX
  69.         ADC     AL,0
  70.         LOOP    J1
  71.         MOV     CX,1710H        ;5904 ?
  72.         MOV     AX,BX
  73.         CALL    J2
  74.         MOV     AX,BP
  75. J2:     PUSH    AX
  76.         MOV     DL,AH
  77.         CALL    J3
  78.         POP     DX
  79. J3:     MOV     DH,DL
  80.         SHR     DL,1            ;Move high
  81.         SHR     DL,1            ; nibble to
  82.         SHR     DL,1            ; the low
  83.         SHR     DL,1            ; position.
  84.         CALL    J4
  85.         MOV     DL,DH
  86. J4:     AND     DL,0FH          ;Mask low nibble
  87.         JZ      J5              ;If not zero
  88.         MOV     CL,0
  89. J5:     DEC     CH
  90.         AND     CL,CH
  91.         OR      DL,'0'          ;Fold in ASCII zero
  92.         SUB     DL,CL
  93.         PUSH    DI              ;save DI                                2.4
  94.         MOV     DI,OFFSET DOUBLE ;point to DOUBLE                  2.4
  95.         ADD     DI,WORD PTR DBLCNT  ;add current offset            2.4
  96.         INC     WORD PTR DBLCNT  ;bump offset for next time        2.4
  97.         MOV     BYTE PTR DS:[DI],DL ;move next digit to DOUBLE          2.4
  98.         POP     DI              ;restore DI                             2.4
  99.         RET                     ;Exit to caller
  100. PRINTDX ENDP                    ;                                       2.4
  101.  
  102. J6      PROC    NEAR
  103.         ADC     AL,AL
  104.         DAA
  105.         XCHG    AL,AH
  106.         ADC     AL,AL
  107.         DAA
  108.         XCHG    AL,AH
  109.         RET
  110. J6      ENDP
  111.  
  112.         END
  113.  
  114.